﻿using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Input.Platform;
using Nlnet.Avalonia.Controls;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using MsBox.Avalonia.Enums;
using OpenQA.Selenium.Chromium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Remote;
using System.Drawing;
using Icon = MsBox.Avalonia.Enums.Icon;
using System.Runtime.InteropServices;
using 畜牧业审核程序国产.Models.ToolsClass;



namespace 畜牧业审核程序国产.Models
{
    internal class 网络操作
    {
        public string[] arrStr_生猪 = new string[] { "户编码","户主姓名", "期末存栏合计01", "25公斤以下仔猪02",
        "待育肥猪03","50公斤以上04", "种猪05", "能繁殖母猪06","当季增加头数07", "自繁08","购进09",
        "当季减少头数10","自宰肥猪头数11","出售肥猪头数（不包括出售待育肥猪）12","出售肥猪金额13",
          "出售肥猪重量14","其它原因减少（包括死亡、疫病捕杀）15","出售25公斤以下仔猪头数16",
          "出售25公斤以下仔猪金额17","出售25公斤以下仔猪重量18"};
        public string[] arrStr_牛 = new string[] { "户编码","户主姓名", "期末存栏头数01", "肉牛02",
        "能繁殖母牛03","奶牛04", "在产奶牛05", "当季增加头数06","自繁07", "肉牛08","奶牛09",
        "购进10","肉牛11"," 奶牛12","期内减少头数13","自宰肉牛数量14","出售肉牛数量15","出售肉牛金额16",
          "出售肉牛重量17","当季生牛奶产量18"};
        public string[] arrStr_羊 = new string[] { "户编码","户主姓名", "期末存栏只数01", "山   羊02",
        "能繁殖母山羊03","绵(湖)羊04", "能繁殖母绵羊05", "期内增加只数06","自繁07", "山   羊08","绵(湖)羊09",
        "购进10","山   羊11","绵(湖)羊12","期内减少只数13","自宰羊数量14","出售羊数量15","出售羊金额16",
          "出售羊重量17","当季绵羊毛产量18","当季山羊绒产量19"};
        public string[] arrStr_禽 = new string[] { "户编码","户主姓名", "期末存栏只数01", "肉用02",
        "其中：肉鸡03","蛋用04", "其中：蛋鸡05", "期内减少只数06","自宰家禽数量07", "其中：活鸡08","出售家禽数量09",
        "其中：活鸡10","出售家禽金额11"," 其中：活鸡12","出售家禽重量13","其中：活鸡14","当季禽蛋产量15","其中：鸡蛋16"};

        public static async Task<bool> Get国网数据(string 用户名, string 密码, Dictionary<int, int> intYearAndSeason, string 下载路径)
        {
            #region 先确定用户名和密码已经填入
            if (string.IsNullOrEmpty(用户名) == true || string.IsNullOrEmpty(密码) == true)
            {
                await MyMessagebox.Show("请先在加载项中填写国网用户名和密码!");
                return false;
            }
            #endregion
            IWebDriver driver;
            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                // bool isrunning =   IsFirefoxRunning();
                // if (isrunning )
                // {
                //     ConnectToRunningFirefox();
                //     var options1 = new FirefoxOptions();
                //     // options1.DebuggerAddress = "localhost:4444"; // 使用 Marionette 端口
                //
                //     // 创建 RemoteWebDriver 实例
                //     driver = new RemoteWebDriver(new Uri("http://localhost:4444"), options1.ToCapabilities());
                //
                //     // 导航到一个网页
                //     driver.Navigate().GoToUrl("http://10.6.132.16:9090/xmydata/login.do");
                //
                //     // 打印页面标题
                //     Console.WriteLine("Page title: " + driver.Title);
                // }
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
                {
                    var chromeOptions = new ChromeOptions();
                    chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                    chromeOptions.AddArgument("--allow-running-insecure-content");
                    chromeOptions.AddArgument("--disable-dev-shm-usage");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new ChromeDriver("/usr/bin/chromedriver", chromeOptions);
                }
                //else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                //{
                //    var edgeOptions = new EdgeOptions();
                //    edgeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //    edgeOptions.AddArgument("--allow-running-insecure-content");
                //    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    edgeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                //    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    edgeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //    edgeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //    driver = new EdgeDriver(@"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe");
                //}
                //else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.X64)
                //{
                //    var chromeOptions = new ChromeOptions();
                //    chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //    chromeOptions.AddArgument("--allow-running-insecure-content");
                //    chromeOptions.AddArgument("--disable-dev-shm-usage");
                //    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                //    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //    chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //    driver = new ChromeDriver("/usr/bin/microsoft-edge", chromeOptions);
                //}
                else
                {
                    var edgeOptions = new EdgeOptions();
                    edgeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                    edgeOptions.AddArgument("--allow-running-insecure-content");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    edgeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new EdgeDriver(edgeOptions);
                }



                //chrome的浏览器
                //var chromeOptions = new ChromeOptions();
                //chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //chromeOptions.AddArgument("--allow-running-insecure-content");
                //chromeOptions.AddArgument("--disable-dev-shm-usage");
                //chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                //chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //driver = new ChromeDriver(chromeOptions);

                //EDGE的浏览器
                // var chromeOptions = new EdgeOptions();
                // chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                // chromeOptions.AddArgument("--allow-running-insecure-content");
                // chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                // chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                // chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                // chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                // chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                // driver = new EdgeDriver(chromeOptions);

                //火狐浏览器
                //var firefoxOptions = new FirefoxOptions();
                // firefoxOptions.SetPreference("browser.download.dir", 下载路径); // 替换为你的下载路径
                // firefoxOptions.SetPreference("browser.download.folderList", 2); // 2 表示使用自定义下载路径
                // firefoxOptions.SetPreference("browser.download.manager.showWhenStarting", false); // 不显示下载管理器
                // firefoxOptions.SetPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream"); // 自动保存文件类型
                // firefoxOptions.SetPreference("security.insecure_field_warning.contextual.enabled", false); // 忽略不安全的字段警告
                //driver = new FirefoxDriver(firefoxOptions);


                sw.Stop();
                TimeSpan timeTaken = sw.Elapsed;
                //MyMessagebox.Show($"用时{timeTaken.TotalSeconds.ToString()}");
            }
            catch (Exception ex)
            {
                StaticLogger.SystemError($"调用浏览器没有成功,错误内容为{ex.Message}");
                //await MyMessagebox.ShowAsyncInMainWindow($"调用微软的Edge浏览器没有成功,很可能是selenium没有被给予运行权限。具体错误内容为{ex.Message}", Icon.Error);
                return false;
            }
            //打开国网网址
            try
            {
                driver.Navigate().GoToUrl("http://10.6.132.16:9090/xmydata/login.do");
                WebDriverWait wait登录界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));

                wait登录界面加载好.Until(d =>
                {
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete");
                });
                // 等待10秒，直到名为 "loginform" 的表单元素出现
                // 如果表单元素出现，则继续后续操作
                // wait登录界面加载好.Until(ExpectedConditions.ElementExists(By.Name("loginForm")));
            }
            catch (NoSuchWindowException)
            {
                driver.Quit();
                await MyMessagebox.Show("浏览器被关闭,请确保能正常登陆国网平台");
                return false;
            }
            catch (Exception)// (WebDriverException)无法捕捉NoSuchWindowException,因此上面又加了一句
            {
                driver.Quit();
                await MyMessagebox.Show("网络错误,请确保能正常登陆国网平台");
                return false;
            }



            //登录
            try
            {
                IWebElement UserName = driver.FindElement(By.Name("userId"));
                IWebElement password = driver.FindElement(By.Name("passwd"));
                UserName.SendKeys(用户名);
                password.SendKeys(密码);
                #region 手动填写验证码
                IWebElement 同一个验证码输入框 = driver.FindElement(By.Name("imgtvalidate")); // 根据实际情况定位 input 元素
                同一个验证码输入框.Click();
                //等待这个验证码输入框被填好四个字符
                WebDriverWait wait_验证码填好 = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); // 设置最大等待时间,10秒改为30秒,用户需要在30秒内输入验证码

                wait_验证码填好.Until(driver1 => 同一个验证码输入框.GetAttribute("value").Length >= 4); // 等待 input 的 value 属性长度符合要求
                #endregion
                #region 通过点击中心点的方式
                IWebElement button_登陆确定 = driver.FindElement(By.XPath("//tbody[1]//tbody[1]//tr[7]//td[1]"));
                //MessageBox.Show(Convert.ToString(button_登陆确定.Size));
                Thread.Sleep(300);//等待半秒钟，改成等待0.3秒,防止手动点击
                int x = 0; int y = 0;
                int a = button_登陆确定.Location.X; int b = (button_登陆确定.Size.Width / 2); int c
                     = button_登陆确定.Location.Y; int e = (button_登陆确定.Size.Height / 2);
                x = button_登陆确定.Location.X + (button_登陆确定.Size.Width / 2);
                y = button_登陆确定.Location.Y + (button_登陆确定.Size.Height / 2);
                // 使用 Actions 类模拟鼠标操作
                Actions actions登录 = new Actions(driver);
                // 将鼠标移动到页面的初始位置 (0, 0)
                actions登录.Reset();

                //actions登录.MoveByOffset(0, 0).Click().Perform();
                actions登录.MoveByOffset(x, y).Click().Perform();
                #endregion
                /////////////////////////////////////////找到数据录入\修改并点击//////////////////////////
                //①等待登录后的界面加载好
                WebDriverWait wait_登录后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间
                wait_登录后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                if (Regex.IsMatch(driver.Title, "系统错误") == true)
                {
                    driver.Close();
                    driver.Quit();
                    MyMessagebox.Show($"用户名密码错误或验证码输错,浏览器已退出!{Environment.NewLine}请在大写或英文状态下输入验证码,输入后不要点击确定,程序会自动点击,现在请重新再试一次");
                    return false;
                }
                else if (Regex.IsMatch(driver.Title, "系统提示"))
                {
                    IWebElement tdElement = driver.FindElement(By.XPath("//td[@align='center']/descendant::input[@value='确定']"));

                    // 点击确定按钮
                    tdElement.Click();
                    WebDriverWait wait_已登录界面点击确定后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                    wait_已登录界面点击确定后界面加载好.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(1000);
                    //driver.Quit();
                    //MessageBox.Show("该用户现在在其他地方登陆,请重新执行一次", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //return false;
                }
                else if (Regex.IsMatch(driver.Title, "密码修改"))
                {
                    //业务代码怎么返回去给viewmodel,最后保存到properties里面
                    //暂时先提示吧
                    MyMessagebox.Show("请先在本界面修改密码,再关闭重新开始下载");
                    return false;
                }

            }
            catch (Exception)
            {
                driver.Quit();
                await MyMessagebox.Show($"验证码输入超时或者验证码输错,浏览器已退出{Environment.NewLine}请在20秒内输入验证码,输好后不要点击确定,程序会自动点击,现在请重新再试一次");
                return false;
            }



            //②先获得主窗口的句柄
            string MainWindowHandle = driver.CurrentWindowHandle;
            #region 打开数据查询界面
            foreach (KeyValuePair<int, int> pair in intYearAndSeason)
            {



                //③重新加载好以后,要进入"数据查询"
                //先导航到左侧的frame
                IWebElement leftFrame = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frame[1]"));
                //切换到左侧frame
                driver.SwitchTo().Frame(leftFrame);
                //再找到item6,即"数据查询"
                IWebElement item6 = driver.FindElement(By.Id("item6"));
                //点击"数据查询"按钮
                item6.Click();
                WebDriverWait wait_点了数据查询后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                       //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                wait_点了数据查询后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                Thread.Sleep(1000);
                //切换回去后,找到下面橙黄色的"数据查询"
                //driver.SwitchTo().Frame(leftFrame);
                // IWebElement btn_橙黄色基层数据查询 = driver.FindElement(By.LinkText("基层数据查询"));
                IWebElement btn_橙黄色基层数据查询 = driver.FindElement(By.CssSelector("a[href='../query/linkToBTQByTable.do']"));
                btn_橙黄色基层数据查询.Click();
                // Thread.Sleep(1000);//这里不暂停旧卡住了?10.22
                //点击一下,等待录入修改页面加载完成.这里要改一下,别忘了
                WebDriverWait wait_基层查询界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                    //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                wait_基层查询界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                Thread.Sleep(1000);//这里不暂停旧卡住了?10.22
                #endregion
                #region 根据现在的季度(外面传进来的)下载对应的畜种报表
                //先从嵌套的 <iframe> 或 <frame> 切换回默认的网页内容。
                driver.SwitchTo().DefaultContent();
                //跳转到右下最大的框架
                IWebElement RightFrameElement = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frameset[1]//frame[1]"));
                driver.SwitchTo().Frame(RightFrameElement);//切换到右侧的frameset
                                                           //找到制度选择框
                IWebElement 制度选择框 = driver.FindElement(By.Name("regime"));
                //选择对应的制度和报告期
                string str_选择的制度 = null;
                string str_报告选择期 = null;
                str_选择的制度 = $"A农林牧渔业统计报表制度({pair.Key.ToString()})";
                string 汉字 = null;
                if (pair.Value == 1)
                {
                    汉字 = "一";
                }
                else if (pair.Value == 2)
                {
                    汉字 = "二";
                }
                else if (pair.Value == 3)
                {
                    汉字 = "三";
                }
                else
                {
                    汉字 = "四";
                }
                str_报告选择期 = $"{pair.Key.ToString()}年{汉字}季度";
                //SelectElement select制度 = new SelectElement(制度选择框);
                //select制度.SelectByText(str_选择的制度);
                制度选择框.SendKeys(str_选择的制度);
                WebDriverWait wait_选择好制度后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                wait_选择好制度后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                Thread.Sleep(1000);
                //找到期别选择框
                IWebElement 期别选择框 = driver.FindElement(By.Id("periodType"));
                期别选择框.SendKeys("季报");
                WebDriverWait wait_选择好季报后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                wait_选择好季报后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                Thread.Sleep(1000);
                //找到报告期选择框
                IWebElement 报告期选择框 = driver.FindElement(By.Id("period"));
                报告期选择框.SendKeys(str_报告选择期);
                WebDriverWait wait_选择好报告期后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                wait_选择好报告期后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });
                Thread.Sleep(1000);
                #endregion
                #region 找到表号并下载
                // 在 WebDriver 对象上使用 FindElement 方法找到具有指定类名的 <td> 元素
                IWebElement 表号Element = driver.FindElement(By.CssSelector("td.dyg"));//查找 <td> 标签中 class 属性包含 dyg 的元素,有很多个
                                                                                     //试试
                driver.SwitchTo().DefaultContent();

                string[] arrstr_要下载的表名;
                if (pair.Key == 2023)
                {
                    //if (pair.Value == 4)
                    //{
                    arrstr_要下载的表名 = new string[] { "生猪生产调查过录表(Q)（新样本）", "牛生产调查过录表（新样本）", "羊生产调查过录表（新样本）", "家禽生产调查过录表（新样本）" };
                    //}
                    //else
                    //{
                    arrstr_要下载的表名 = new string[] { "生猪生产调查过录表(Q)（老样本）", "牛生产调查过录表（老样本）", "羊生产调查过录表（老样本）", "家禽生产调查过录表（老样本）" };
                    // }

                }
                else
                {
                    arrstr_要下载的表名 = new string[] { "生猪生产调查过录表(Q)", "牛生产调查过录表", "羊生产调查过录表", "家禽生产调查过录表" };
                }
                foreach (string item in arrstr_要下载的表名)
                {
                    RightFrameElement = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frameset[1]//frame[1]"));
                    driver.SwitchTo().Frame(RightFrameElement);//切换到右侧frame
                    IWebElement inputElement = driver.FindElement(By.LinkText(item));
                    inputElement.Click();
                    WebDriverWait wait_基层数据查询界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                          //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                    wait_基层数据查询界面加载好.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete");
                    });
                    Thread.Sleep(1000);
                    var windowHandles = driver.WindowHandles;
                    string 基层数据查询窗口 = null;
                    // 遍历窗口句柄，切换到新窗口
                    foreach (var handle in windowHandles)
                    {
                        if (handle != MainWindowHandle)
                        {
                            基层数据查询窗口 = handle;
                            driver.SwitchTo().Window(handle);//切换到刚打开的页面
                            break;
                        }
                    }
                    //切换到这个刚打开的页面的默认值
                    driver.SwitchTo().DefaultContent();
                    IWebElement 选择查询模板frame = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frame[1]"));
                    driver.SwitchTo().Frame(选择查询模板frame);
                    IWebElement 选择查询模板Element = driver.FindElement(By.Id("querytemp"));//找到查询模板的下拉框
                    选择查询模板Element.Click();
                    Thread.Sleep(1000);
                    // 使用 SelectElement 对象包装下拉框元素
                    SelectElement select = new SelectElement(选择查询模板Element);

                    // 获取下拉框中所有选项
                    IList<IWebElement> options = select.Options;

                    // 正则表达式，用于匹配符合要求的内容
                    string pattern = "导出";
                    foreach (var option in options)
                    {
                        if (Regex.IsMatch(option.Text, pattern))
                        {
                            option.Click();
                            break;
                        }
                    }
                    WebDriverWait wait_点击了查询模板 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));

                    wait_点击了查询模板.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    });
                    #region 废弃
                    //IWebElement 选择指标button =  driver.FindElement(By.CssSelector("input[type='button'][value='选择指标'].btn0.bhl"));
                    //选择指标button.Click();

                    //WebDriverWait wait_数据查询界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                    //                                                                                    //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                    //wait_数据查询界面加载好.Until<bool>((d) =>
                    //{
                    //    // 使用JavaScript代码判断页面的加载状态
                    //    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    //});
                    //#region 切换到新的网页


                    //// 获取所有窗口句柄
                    //IReadOnlyCollection<string> AllwindowHandles = driver.WindowHandles;

                    //// 切换到新打开的页面
                    //driver.SwitchTo().Window(AllwindowHandles.Last());
                    //#endregion
                    //IWebElement dropdown = driver.FindElement(By.Name("colInfosAll"));

                    //SelectElement select = new SelectElement(dropdown);
                    //if (Regex.IsMatch(item, "生猪") == true)
                    //{


                    //    // 通过选项的值或可见文本来选择多个选项
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM1WFTECH1WFTECH0WFTECH单位负责人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM3WFTECH1WFTECH0WFTECH报出日期(年)");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM4WFTECH1WFTECH0WFTECH报出日期(月)");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM5WFTECH1WFTECH0WFTECH报出日期(日)");

                    //    //select.SelectByValue("8600000002023062907560001WFTECHM6WFTECH1WFTECH0WFTECH省");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    //select.SelectByValue("8600000002023062907560001WFTECHM2WFTECH1WFTECH0WFTECH填表人");
                    //    for (int i = 0; i <= 42; i++)
                    //    {
                    //        if (i != 38)
                    //        {
                    //            select.SelectByIndex(i);
                    //        }
                    //    }
                    //    //点击向右箭头
                    //    driver.SwitchTo().DefaultContent();
                    //    IWebElement 向右箭头button = driver.FindElement(By.CssSelector("input[value='>>>'][onclick*=\"moveItem('colInfosAll', 'colInfosSel')\"]"));
                    //    向右箭头button.Click();
                    //    driver.SwitchTo().DefaultContent();
                    //    //IWebElement button确定 = driver.FindElement(By.CssSelector("//input[onclick='confirm()'][value='确定']"));
                    //    IWebElement button确定 = driver.FindElement(By.CssSelector("input[value='确定'][onclick='confirm();']"));
                    //    button确定.Click();
                    //}
                    #endregion
                    //if (Regex.IsMatch(item, "生猪") == true)
                    //{
                    //    选择查询模板Element.SendKeys("生猪导出模板");
                    //}
                    //else if (Regex.IsMatch(item, "牛") == true)
                    //{
                    //    选择查询模板Element.SendKeys("牛导出模板");
                    //}
                    //else if (Regex.IsMatch(item, "羊") == true)
                    //{
                    //    选择查询模板Element.SendKeys("羊导出模板");
                    //}
                    //else
                    //{
                    //    选择查询模板Element.SendKeys("家禽导出模板");
                    //}
                    driver.SwitchTo().DefaultContent();
                    driver.SwitchTo().Frame(选择查询模板frame);
                    Thread.Sleep(500);
                    //IWebElement 导出excel按钮 = driver.FindElement(By.XPath(("//input[@value='导出Excel']")));
                    IWebElement 导出excel按钮 = driver.FindElement(By.XPath("//input[@onclick=\"toExportData('xls'); return false;\"]"));

                    导出excel按钮.Click();
                    //等待导出选项出来
                    WebDriverWait wait_导出选项界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                        //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                    wait_导出选项界面加载好.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    });
                    // 切换到 popframe iframe 
                    IWebElement popframe = driver.FindElement(By.Id("popframe"));
                    driver.SwitchTo().Frame(popframe);
                    IWebElement 整体导出按钮 = driver.FindElement(By.CssSelector("a#id0"));
                    整体导出按钮.Click();
                    Thread.Sleep(500);
                    driver.Close();
                    //获取所有窗口句柄
                    IReadOnlyCollection<string> AllwindowHandles = driver.WindowHandles;

                    //切换到新打开的页面
                    driver.SwitchTo().Window(AllwindowHandles.Last());

                    driver.Close();
                    driver.SwitchTo().Window(MainWindowHandle);
                }
                Thread.Sleep(4000);//全部导出完毕以后,在点击"我的消息"前暂停一下,等待我的消息里面出现
                #endregion
                #region 下载到本地
                for (int i = 1; i <= 4; i++)
                {
                    driver.SwitchTo().DefaultContent();

                    //切换到上面的这一排按钮
                    IWebElement 我的消息frame = driver.FindElement(By.XPath(("//frameset[1]//frame[1]")));
                    driver.SwitchTo().Frame(我的消息frame);
                    //找到我的消息按钮
                    IWebElement 我的消息按钮 = driver.FindElement(By.Id("a_2"));
                    我的消息按钮.Click();
                    //要写等待完成进入到我的消息界面了
                    //等待"我的消息"点击后界面加载好
                    WebDriverWait wait_我的消息界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒

                    wait_我的消息界面加载好.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    });
                    //切换到初始页面
                    driver.SwitchTo().DefaultContent();
                    IWebElement 下载界面frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
                    driver.SwitchTo().Frame(下载界面frame);
                    //先等个一秒钟
                    Thread.Sleep(1000);
                    //先找到序号为1的单元格,再找打
                    IWebElement cellWithNumber1 = driver.FindElement(By.XPath("//td[@class='lb34 lftd2n' and text()='" + i.ToString() + "']"));
                    IWebElement rightCell = cellWithNumber1.FindElement(By.XPath("./following-sibling::td[1]"));
                    IWebElement linkElement = rightCell.FindElement(By.TagName("a"));
                    // 点击<a>元素
                    linkElement.Click();
                    WebDriverWait wait_点了序号后面表号界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                            //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
                    wait_点了序号后面表号界面加载好.Until<bool>((d) =>
                    {
                        // 使用JavaScript代码判断页面的加载状态
                        return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                    });
                    //await一下
                    driver.SwitchTo().DefaultContent();
                    IWebElement 左键导出数据frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
                    driver.SwitchTo().Frame(左键导出数据frame);
                    IWebElement 左键导出按钮 = driver.FindElement(By.XPath($"//*[contains(text(), '左键点击或者右键点击')]"));
                    左键导出按钮.Click();
                    Thread.Sleep(2000);
                    ////// 使用 Actions 类执行右键点击并选择“另存为”
                    ////Actions action = new Actions(driver);
                    ////action.ContextClick(左键导出按钮).Build().Perform();

                    ////// 选择弹出菜单中的“另存为”菜单项
                    ////IWebElement 另存为菜单项 = driver.FindElement(By.XPath("//*[contains(text(), '另存为') or contains(@value, '另存为')]"));
                    ////另存为菜单项.Click();
                    // 模拟键盘操作实现“另存为”
                    //Actions action = new Actions(driver);
                    //action.MoveToElement(左键导出按钮).ContextClick().SendKeys(OpenQA.Selenium.Keys.ArrowDown).SendKeys(OpenQA.Selenium.Keys.Enter).Build().Perform();


                    //先切换到
                    //ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.XPath($"//*[contains(text(), '生猪生产')]"));
                    //IWebElement 生猪按钮 = elements.FirstOrDefault();
                    //生猪按钮.Click();
                    ////进入查看接收消息界面
                    //Thread.Sleep(1000);
                    //driver.SwitchTo().DefaultContent();
                    //IWebElement 左键导出数据frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
                    //driver.SwitchTo().Frame(左键导出数据frame);
                    //IWebElement 左键导出按钮 = driver.FindElement(By.XPath($"//*[contains(text(), '左键点击或者右键点击')]"));
                    //左键导出按钮.Click();
                }
                #endregion
                driver.SwitchTo().Window(MainWindowHandle);
            }

            await 是否已经下载完毕Async();
            //await Task.Delay(1000);
            //Thread.Sleep(10000);
            driver.Quit();
            return true;
        }
        public static async Task<bool> 是否已经下载完毕Async()
        {
            if (Directory.Exists(Path.Combine(MyDataFolderOperator.AuditProgramFolderPath, "下载的数据")) == false)
            {
                Directory.CreateDirectory(Path.Combine(MyDataFolderOperator.AuditProgramFolderPath, "下载的数据"));
            }
            DateTime startTime = DateTime.Now;
            while (true)
            {
                bool 下载中间件是否存在 = CheckForTmpOrCrdownloadFiles(Path.Combine(MyDataFolderOperator.AuditProgramFolderPath, "下载的数据"));
                if (下载中间件是否存在 == false)
                {
                    Console.WriteLine($"全部下载完毕时间{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff")}");
                    return true;
                }
                // 如果超过100秒且文件仍未下载完毕，则修改文件格式为.zip
                if ((DateTime.Now - startTime).TotalSeconds > 10)
                {
                    TranslateFilesToZipFormat(Path.Combine(MyDataFolderOperator.AuditProgramFolderPath, "下载的数据"));
                    return true;
                }
                await Task.Delay(1000);
                //Thread.Sleep(1000);
            }
            //return await Task.FromResult(true);
        }
        static bool CheckForTmpOrCrdownloadFiles(string folderPath)
        {

            if (Directory.Exists(folderPath))
            {
                string[] files = Directory.GetFiles(folderPath);

                foreach (string file in files)
                {
                    if (Path.GetExtension(file).Equals(".tmp", StringComparison.OrdinalIgnoreCase) || Path.GetExtension(file).Equals(".crdownload", StringComparison.OrdinalIgnoreCase))
                    {
                        return true;
                    }
                }
            }

            return false;
        }
        static void TranslateFilesToZipFormat(string folderPath)
        {
            if (Directory.Exists(folderPath))
            {
                string[] files = Directory.GetFiles(folderPath);

                foreach (string file in files)
                {
                    if (Path.GetExtension(file).Equals(".tmp", StringComparison.OrdinalIgnoreCase) || Path.GetExtension(file).Equals(".crdownload", StringComparison.OrdinalIgnoreCase))
                    {
                        string newFilePath = Path.ChangeExtension(file, ".zip");
                        File.Move(file, newFilePath);
                    }
                }
            }
        }

        public static void GetProvinceData(string userName, string password, KeyValuePair<int, int> intYearAndSeason, string downloadPath) { }
        public static async Task<bool> Get406(string 用户名, string 密码, int int_year, int int_quarter, string 下载路径)
        {
            #region 确定用户名和密码是否都在
            if (string.IsNullOrEmpty(用户名) == true || string.IsNullOrEmpty(密码) == true)
            {
                MyMessagebox.Show("请先在加载项中填写省网用户名和密码!");
                return false;
            }
            #endregion
            #region 判断是否安装了chrome和edge浏览器
            IWebDriver driver;
            try
            {
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
                {
                    var chromeOptions = new ChromeOptions();
                    chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                    chromeOptions.AddArgument("--allow-running-insecure-content");
                    chromeOptions.AddArgument("--disable-dev-shm-usage");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.33.20.100");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new ChromeDriver("/usr/bin/chromedriver", chromeOptions);
                }
                //else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                //{
                //    var edgeOptions = new EdgeOptions();
                //    edgeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //    edgeOptions.AddArgument("--allow-running-insecure-content");
                //    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    edgeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.33.20.100");
                //    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    edgeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //    edgeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //    driver = new EdgeDriver(@"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe");
                //}
                //else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.X64)
                //{
                //    var chromeOptions = new ChromeOptions();
                //    chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //    chromeOptions.AddArgument("--allow-running-insecure-content");
                //    chromeOptions.AddArgument("--disable-dev-shm-usage");
                //    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.33.20.100");
                //    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //    chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //    chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //    driver = new ChromeDriver("/usr/bin/microsoft-edge", chromeOptions);
                //}
                else
                {
                    var edgeOptions = new EdgeOptions();
                    edgeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                    edgeOptions.AddArgument("--allow-running-insecure-content");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.33.20.100");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    edgeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new EdgeDriver(edgeOptions);
                }


                //ChromeOptions chromeOptions = new ChromeOptions();
                //chromeOptions.AddUserProfilePreference("download.default_directory", 下载路径);
                //chromeOptions.AddArgument("--allow-running-insecure-content");
                //chromeOptions.AddArgument("--disable-dev-shm-usage");
                //chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.33.20.100/ydata/login.do");
                ////chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://lwzbydata.tjj.zj.gov.cn/ydata/login.do");不能写
                //chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                //chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                //chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                //driver = new ChromeDriver(chromeOptions);

            }
            catch (Exception ex)
            {
                StaticLogger.SystemError($"无法读取调用Chrome浏览器,错误信息为{ex.Message}");
                await MyMessagebox.Show("无法读取调用Chrome浏览器");
                return false;
            }
            #endregion
            //var options = new InternetExplorerOptions();
            //options.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
            //options.IgnoreZoomLevel = true;

            //WebDriverManager.IEDriver().Setup(); // 使用 WebDriverManager 管理 IE 驱动程序

            //IWebDriver driver = new InternetExplorerDriver(options);
            #region 打开省网网址
            try
            {
                //driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);
                driver.Navigate().GoToUrl("http://10.33.20.100/ydata/login.do");
                //driver.Navigate().GoToUrl("http://lwzbydata.tjj.zj.gov.cn/ydata/login.do");
                WebDriverWait wait登录界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                //wait.Until(d => d.Url != "about:blank");
                //wait.Until(d =>
                //{
                //    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete");
                //});
                // 等待10秒，直到名为 "loginform" 的表单元素出现
                // 如果表单元素出现，则继续后续操作
                wait登录界面加载好.Until(ExpectedConditions.ElementExists(By.Name("loginForm")));
            }
            catch (NoSuchWindowException)
            {
                driver.Quit();
                await MyMessagebox.Show("浏览器被关闭,请确保能正常登陆省网平台");
                return false;
            }
            catch (Exception)// (WebDriverException)无法捕捉NoSuchWindowException,因此上面又加了一句
            {
                driver.Quit();
                await MyMessagebox.Show("网络错误,请确保能正常登陆省网平台");
                return false;
            }
            #endregion
            #region 试图登录
            try
            {
                //    bool isframe1Exists = false;
                //while (isframe1Exists == false)
                //{

                //////////////////////////////////等待登陆界面加载/////////////////////////////////////////怎么同一个连接登录网址写了两遍?
                // 一>等待登陆页面加载完成.下面两句可以被注释,上面已经等待国网网址加载完成了
                //WebDriverWait wait_登陆界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                //wait_登陆界面加载好.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.UrlToBe("http://10.6.132.16:9090/xmydata/login.do"));
                // 二-> 把用户名和密码加载进填报框
                IWebElement UserName = driver.FindElement(By.Name("userId"));
                IWebElement password = driver.FindElement(By.Name("passwd"));
                //    把文本框的值填进去
                UserName.SendKeys(用户名);
                password.SendKeys(密码);

                #region 手动填写验证码
                IWebElement 同一个验证码输入框 = driver.FindElement(By.Name("imgtvalidate")); // 根据实际情况定位 input 元素
                                                                                     //等待这个验证码输入框被填好四个字符
                WebDriverWait wait_验证码填好 = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); // 设置最大等待时间,10秒改为30秒,用户需要在30秒内输入验证码

                wait_验证码填好.Until(driver1 => 同一个验证码输入框.GetAttribute("value").Length >= 4); // 等待 input 的 value 属性长度符合要求
                #endregion

                #region 通过点击中心点的方式
                IWebElement button_登陆确定 = driver.FindElement(By.XPath("//tbody[1]//tbody[1]//tr[7]//td[1]"));
                //MessageBox.Show(Convert.ToString(button_登陆确定.Size));
                Thread.Sleep(300);//等待半秒钟，改成等待0.3秒,防止手动点击
                //找到登陆按钮的中心位置并点击
                int x = 0; int y = 0;
                int a = button_登陆确定.Location.X; int b = (button_登陆确定.Size.Width / 2); int c
                     = button_登陆确定.Location.Y; int e = (button_登陆确定.Size.Height / 2);
                x = button_登陆确定.Location.X + (button_登陆确定.Size.Width / 2);
                y = button_登陆确定.Location.Y + (button_登陆确定.Size.Height / 2);
                // 使用 Actions 类模拟鼠标操作
                Actions actions登录 = new Actions(driver);
                // 将鼠标移动到页面的初始位置 (0, 0)
                actions登录.Reset();
                // actions登录.MoveByOffset(0, 0).Click().Perform();
                actions登录.MoveByOffset(x, y).Click().Perform();
                #endregion

                /////////////////////////////////////////找到数据录入\修改并点击//////////////////////////
                //①等待登录后的界面加载好
                WebDriverWait wait_登录后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间

                // wait_登录后界面加载好.Until(ExpectedConditions.ElementExists(By.Id("frameset1"))); // 使用frameset1是否存在来等待页面重新加载
                //wait_登录后界面加载好.Until(SeleniumExtras.WaitHelpers.PresenceOfAllElementsLocatedBy(By.TagName("body"))
                wait_登录后界面加载好.Until<bool>((d) =>
                {
                    // 使用JavaScript代码判断页面的加载状态
                    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                });

                //if (driver.FindElements(By.Name("loginForm")).Count > 0)
                //{

                //// 在网页上弹出简单的警告框
                //IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
                //js.ExecuteScript("alert('验证码输错了,为了便于程序运行,现在请重新点击审核,重新登陆国网平台');");
                //// 等待用户点击确定
                //driver.SwitchTo().Alert().Accept();
                if (Regex.IsMatch(driver.Title, "系统错误") == true)
                {
                    driver.Close();
                    driver.Quit();
                    MyMessagebox.Show("用户名密码错误或验证码输错,浏览器已退出!" + "\r\n" + "请在大写或英文状态下输入验证码,输入后不要点击确定,程序会自动点击,现在请重新再试一次");
                    return false;
                }
                else if (Regex.IsMatch(driver.Title, "系统提示"))
                {
                    IWebElement tdElement = driver.FindElement(By.XPath("//td[@align='center']/descendant::input[@value='确定']"));

                    // 点击确定按钮
                    tdElement.Click();
                    Thread.Sleep(1000);
                    //driver.Quit();
                    //MessageBox.Show("该用户现在在其他地方登陆,请重新执行一次", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //return false;
                }

            }
            catch (Exception)
            {
                driver.Quit();
                await MyMessagebox.Show("验证码输入超时或者验证码输错,浏览器已退出" + "\r\n" + "请在20秒内输入验证码,输好后不要点击确定,程序会自动点击,现在请重新再试一次");
                return false;
            }
            #endregion

            #region 打开数据查询界面
            //②先获得主窗口的句柄
            string MainWindowHandle = driver.CurrentWindowHandle;
            //③重新加载好以后,要进入"数据查询"
            //先导航到左侧的frame
            IWebElement leftFrame = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frame[1]"));
            //切换到左侧frame
            driver.SwitchTo().Frame(leftFrame);
            //再找到item6,即"数据查询"
            // IWebElement item6 = driver.FindElement(By.Id("item6"));

            IWebElement item6 = driver.FindElement(By.CssSelector("[onclick*='query/intro.jsp']"));
            //点击"数据查询"按钮
            item6.Click();
            WebDriverWait wait_点了数据查询后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
            //wait_点了数据查询后界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
            wait_点了数据查询后界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete");
            });
            Thread.Sleep(200);
            //切换回去后,找到下面橙黄色的"数据查询"
            //driver.SwitchTo().Frame(leftFrame);
            IWebElement btn_橙黄色基层数据查询 = driver.FindElement(By.CssSelector("a[href='../query/linkToBTQByTable.do']"));//原来是text

            btn_橙黄色基层数据查询.Click();
            //点击一下,等待录入修改页面加载完成.这里要改一下,别忘了
            WebDriverWait wait_基层查询界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
            //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
            wait_基层查询界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            #endregion
            #region 根据现在的季度(外面传进来的)下载对应的畜种报表
            //先从嵌套的 <iframe> 或 <frame> 切换回默认的网页内容。
            driver.SwitchTo().DefaultContent();
            //跳转到右下最大的框架
            IWebElement RightFrameElement = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frameset[1]//frame[1]"));
            driver.SwitchTo().Frame(RightFrameElement);//切换到右侧的frameset
            //找到制度选择框
            IWebElement 制度选择框 = driver.FindElement(By.Name("regime"));
            //选择对应的制度和报告期
            string str_选择的制度 = null;
            string str_报告选择期 = null;
            str_选择的制度 = $"浙江省畜牧业调查统计报表制度";
            string 汉字 = null;
            if (int_quarter == 1)
            {
                汉字 = "一";
            }
            else if (int_quarter == 2)
            {
                汉字 = "二";
            }
            else if (int_quarter == 3)
            {
                汉字 = "三";
            }
            else
            {
                汉字 = "四";
            }
            str_报告选择期 = $"{int_year.ToString()}年{汉字}季度";
            制度选择框.SendKeys(str_选择的制度);
            WebDriverWait wait_选择好制度后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
            wait_选择好制度后界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            Thread.Sleep(1000);
            //找到期别选择框
            IWebElement 期别选择框 = driver.FindElement(By.Id("periodType"));
            期别选择框.SendKeys("季报");
            WebDriverWait wait_选择好季报后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
            wait_选择好季报后界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            Thread.Sleep(1000);
            //找到报告期选择框
            IWebElement 报告期选择框 = driver.FindElement(By.Id("period"));
            报告期选择框.SendKeys(str_报告选择期);
            WebDriverWait wait_选择好报告期后界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
            wait_选择好报告期后界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            Thread.Sleep(1000);
            #endregion
            #region 找到表号并下载
            //等待
            // 在 WebDriver 对象上使用 FindElement 方法找到具有指定类名的 <td> 元素
            IWebElement 表号Element = driver.FindElement(By.CssSelector("td.dyg"));//查找 <td> 标签中 class 属性包含 dyg 的元素,有很多个
            //试试
            driver.SwitchTo().DefaultContent();










            RightFrameElement = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frameset[1]//frame[1]"));
            driver.SwitchTo().Frame(RightFrameElement);//切换到右侧frame
            Thread.Sleep(500);
            IWebElement inputElement = driver.FindElement(By.LinkText("畜牧业生产情况季报"));
            inputElement.Click();
            WebDriverWait wait_基层数据查询界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                  //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
            wait_基层数据查询界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            var windowHandles = driver.WindowHandles;
            string 基层数据查询窗口 = null;
            // 遍历窗口句柄，切换到新窗口
            foreach (var handle in windowHandles)
            {
                if (handle != MainWindowHandle)
                {
                    基层数据查询窗口 = handle;
                    driver.SwitchTo().Window(基层数据查询窗口);//切换到刚打开的页面
                    break;
                }
            }
            //切换到这个刚打开的页面的默认值
            driver.SwitchTo().DefaultContent();
            IWebElement 选择查询模板frame = driver.FindElement(By.XPath("//frameset[1]//frameset[1]//frame[1]"));
            driver.SwitchTo().Frame(选择查询模板frame);

            IWebElement 选择查询模板Element = driver.FindElement(By.Id("querytemp"));//找到查询模板的下拉框
            选择查询模板Element.Click();
            // 使用 SelectElement 对象包装下拉框元素
            SelectElement select = new SelectElement(选择查询模板Element);

            // 获取下拉框中所有选项
            IList<IWebElement> options = select.Options;

            // 正则表达式，用于匹配符合带有"导出"字符的模板
            string pattern = "导出";
            foreach (var option in options)
            {
                if (Regex.IsMatch(option.Text, pattern))
                {
                    option.Click();
                    break;
                }
            }
            WebDriverWait wait_点击了查询模板 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));

            wait_点击了查询模板.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });

            //  选择查询模板Element.SendKeys("省网A406表审核导出");

            driver.SwitchTo().DefaultContent();
            driver.SwitchTo().Frame(选择查询模板frame);
            Thread.Sleep(500);
            IWebElement 导出excel按钮 = driver.FindElement(By.XPath(("//input[@value='导出Excel']")));
            导出excel按钮.Click();
            //等待导出选项出来
            WebDriverWait wait_导出选项界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒
                                                                                                //wait_录入修改界面加载好.Until(ExpectedConditions.ElementExists(By.XPath("//frameset[1]//frameset[1]//frame[1]"))); // 使用item6是否存在来等待页面重新加载
            wait_导出选项界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            // 切换到 popframe iframe 
            IWebElement popframe = driver.FindElement(By.Id("popframe"));
            driver.SwitchTo().Frame(popframe);
            Thread.Sleep(500);//0306加
            IWebElement 整体导出按钮 = driver.FindElement(By.CssSelector("a#id0"));
            整体导出按钮.Click();
            Thread.Sleep(300);
            driver.Close();
            //获取所有窗口句柄
            IReadOnlyCollection<string> AllwindowHandles = driver.WindowHandles;

            //切换到新打开的页面
            driver.SwitchTo().Window(AllwindowHandles.Last());

            driver.Close();
            driver.SwitchTo().Window(MainWindowHandle);

            #endregion
            #region 下载到本地
            //先停一下
            Thread.Sleep(2000);
            driver.SwitchTo().DefaultContent();

            //切换到上面的这一排按钮
            IWebElement 我的消息frame = driver.FindElement(By.XPath(("//frameset[1]//frame[1]")));
            driver.SwitchTo().Frame(我的消息frame);
            //找到我的消息按钮
            IWebElement 我的消息按钮 = driver.FindElement(By.Id("a_2"));
            我的消息按钮.Click();
            Thread.Sleep(1500);//0306加
            我的消息按钮.Click();//0306加
            //要写等待完成进入到我的消息界面了
            //等待"我的消息"点击后界面加载好
            WebDriverWait wait_我的消息界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒

            wait_我的消息界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            //切换到初始页面
            driver.SwitchTo().DefaultContent();
            IWebElement 下载界面frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
            driver.SwitchTo().Frame(下载界面frame);
            //先等个一秒钟
            Thread.Sleep(1000);
            //先找到序号为1的单元格,再找打
            IWebElement cellWithNumber1 = driver.FindElement(By.XPath("//td[@class='lb34 lftd2n' and text()='1']"));
            IWebElement rightCell = cellWithNumber1.FindElement(By.XPath("./following-sibling::td[1]"));
            IWebElement linkElement = rightCell.FindElement(By.TagName("a"));
            // 点击<a>元素
            linkElement.Click();
            WebDriverWait wait_点了序号后面表号的界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); // 设置最大等待时间,等待页面加载好的最长等待时间统一设置为15秒

            wait_点了序号后面表号的界面加载好.Until<bool>((d) =>
            {
                // 使用JavaScript代码判断页面的加载状态
                return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
            });
            //await一下
            driver.SwitchTo().DefaultContent();
            IWebElement 左键导出数据frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
            driver.SwitchTo().Frame(左键导出数据frame);
            IWebElement 左键导出按钮 = driver.FindElement(By.XPath($"//*[contains(text(), '左键点击或者右键点击')]"));
            左键导出按钮.Click();
            Thread.Sleep(2000);
            await 是否已经下载完毕Async();
            Thread.Sleep(500);//0306加
                              // await Task.Delay(10000);
                              // Thread.Sleep(10000);
            driver.Quit();
            return true;
            ////// 使用 Actions 类执行右键点击并选择“另存为”
            ////Actions action = new Actions(driver);
            ////action.ContextClick(左键导出按钮).Build().Perform();

            ////// 选择弹出菜单中的“另存为”菜单项
            ////IWebElement 另存为菜单项 = driver.FindElement(By.XPath("//*[contains(text(), '另存为') or contains(@value, '另存为')]"));
            ////另存为菜单项.Click();
            // 模拟键盘操作实现“另存为”
            //Actions action = new Actions(driver);
            //action.MoveToElement(左键导出按钮).ContextClick().SendKeys(OpenQA.Selenium.Keys.ArrowDown).SendKeys(OpenQA.Selenium.Keys.Enter).Build().Perform();


            //先切换到
            //ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.XPath($"//*[contains(text(), '生猪生产')]"));
            //IWebElement 生猪按钮 = elements.FirstOrDefault();
            //生猪按钮.Click();
            ////进入查看接收消息界面
            //Thread.Sleep(1000);
            //driver.SwitchTo().DefaultContent();
            //IWebElement 左键导出数据frame = driver.FindElement(By.XPath(("//frameset[1]//frameset[1]//frameset[1]//frame[1]")));
            //driver.SwitchTo().Frame(左键导出数据frame);
            //IWebElement 左键导出按钮 = driver.FindElement(By.XPath($"//*[contains(text(), '左键点击或者右键点击')]"));
            //左键导出按钮.Click();

            #endregion
        }



        #region 统计云
        public static IWebDriver driver;
        public static string statsCloudMainWindowHandle;
        private static string LoginInStatsCloud(string 用户名, string 密码, string downloadPath)
        {

            if (string.IsNullOrEmpty(用户名) == true || string.IsNullOrEmpty(密码) == true)
            {
                return "请先在加载项中填写国网用户名和密码!";

            }
            #region 判断是否安装了chrome和edge浏览器

            try
            {

                if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
                {
                    var chromeOptions = new ChromeOptions();
                    chromeOptions.AddUserProfilePreference("download.default_directory", downloadPath);
                    chromeOptions.AddArgument("--allow-running-insecure-content");
                    chromeOptions.AddArgument("--disable-dev-shm-usage");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                    chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    chromeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new ChromeDriver("/usr/bin/chromedriver", chromeOptions);
                }

                else
                {
                    var edgeOptions = new EdgeOptions();
                    edgeOptions.AddUserProfilePreference("download.default_directory", downloadPath);
                    edgeOptions.AddArgument("--allow-running-insecure-content");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddArgument("--unsafely-treat-insecure-origin-as-secure= http://10.6.132.16:9090/xmydata/login.do");
                    edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                    edgeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                    edgeOptions.AddUserProfilePreference("safebrowsing.enabled", true);
                    driver = new EdgeDriver(edgeOptions);
                }

            }
            catch (Exception ex)
            {
                StaticLogger.SystemError($"出现错误,错误信息{ex.Message},{Environment.NewLine}堆栈为{ex.StackTrace},{Environment.NewLine}对象为{ex.Source},{Environment.NewLine}方法为{ex.TargetSite}");
                return "无法读取调用edge,建议重新安装edge浏览器并重启";

            }
            #endregion

            #region 打开统计云网址
            string 登录界面Handle = null;
            try
            {

                driver.Navigate().GoToUrl("https://tjyhome.stats.gov.cn/platform/page.html#/pc/login");
                WebDriverWait wait登录界面加载好 = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                登录界面Handle = driver.CurrentWindowHandle;
                // 最大化浏览器窗口
                driver.Manage().Window.Maximize();
                // 定位到 <input> 元素
                IWebElement 用户名inputElement = driver.FindElement(By.XPath("//input[@placeholder='请输入用户名']"));
                用户名inputElement.SendKeys(用户名);
                //  IWebElement 密码inputElement = driver.FindElement(By.XPath("//input[@placeholder='请输入密码']"));
                IWebElement 密码Element = driver.FindElement(By.CssSelector("div.dsfa-password-iframe-input"));
                //密码Element.SendKeys(密码);


                // 定位到 iframe
                IWebElement iframe = driver.FindElement(By.ClassName("dsfa-password-iframe-input_input"));

                // 切换到 iframe
                driver.SwitchTo().Frame(iframe);

                // 定位到密码输入框
                // IWebElement passwordInput = driver.FindElement(By.CssSelector("input[type='password']"));







                IWebElement 密码inputElement = driver.FindElement(By.CssSelector("input[type='password']"));
                //driver.FindElement(By.CssSelector("input[type='password']"));

                密码inputElement.SendKeys(密码);
                // 切换回主文档
                driver.SwitchTo().DefaultContent();

                #region 手动填写验证码
                // 定位到 placeholder 为 "请输入验证码" 的 input 元素
                IWebElement 验证码输入框 = driver.FindElement(By.CssSelector("input[placeholder='请输入验证码']"));

                //等待这个验证码输入框被填好四个字符
                WebDriverWait wait_验证码填好 = new WebDriverWait(driver, TimeSpan.FromSeconds(60)); // 设置最大等待时间,10秒改为30秒,用户需要在30秒内输入验证码

                wait_验证码填好.Until(driver1 => 验证码输入框.GetAttribute("value").Length >= 4); // 等待 input 的 value 属性长度符合要求
                #endregion
                IWebElement 登录btnElement = driver.FindElement(By.XPath("//button[span[text()='登录']]"));
                ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 登录btnElement);//有反应
                Thread.Sleep(700);

                //找到"获取验证码"
                IWebElement 获取短信验证码element = driver.FindElement(By.XPath("//div[@class='send-sms-code-btn']"));
                ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 获取短信验证码element);

                // 1. 找到发短信的小窗口的外层的 div 元素
                IWebElement outerDiv = driver.FindElement(By.ClassName("dsf-sc-login-tab-phone-dialog_warp"));
                IWebElement 短信验证码输入框 = outerDiv.FindElement(By.CssSelector("input[placeholder='请输入验证码']"));


                // 定位到 placeholder 为 "请输入验证码" 的 input 元素
                //IWebElement 短信验证码输入框 = driver.FindElement(By.CssSelector("input[placeholder='请输入验证码']"));

                //等待这个验证码输入框被填好四个字符
                WebDriverWait wait_短信验证码填好 = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); // 设置最大等待时间,10秒改为30秒,用户需要在30秒内输入验证码

                wait_短信验证码填好.Until(driver1 => 短信验证码输入框.GetAttribute("value").Length >= 6); // 等待 input 的 value 属性长度符合要求
                List<IWebElement> 输入手机验证码后登录element = driver.FindElements(By.CssSelector("button.el-button.dsf-sc-login-tab-phone-dialog-sms-login-btn.el-button--primary")).ToList();
                ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 输入手机验证码后登录element[0]);
                Thread.Sleep(3000);
                //②先获得主窗口的句柄
                statsCloudMainWindowHandle = driver.CurrentWindowHandle;
                return null;

            }
            catch (NoSuchWindowException ex)
            {
                StaticLogger.SystemError($"出现找不到窗口错误,错误信息{ex.Message},{Environment.NewLine}堆栈为{ex.StackTrace},{Environment.NewLine}对象为{ex.Source},{Environment.NewLine}方法为{ex.TargetSite}");
                driver.Quit();
                return "浏览器被关闭,请确保能正常登陆统计云平台";

            }
            catch (Exception ex)// (WebDriverException)无法捕捉NoSuchWindowException,因此上面又加了一句
            {
                StaticLogger.SystemError($"出现错误,错误信息{ex.Message},{Environment.NewLine}堆栈为{ex.StackTrace},{Environment.NewLine}对象为{ex.Source},{Environment.NewLine}方法为{ex.TargetSite}");
                driver.Quit();
                return $"出现错误,错误信息为{ex.Message}";

            }
            #endregion


        }
        public static async Task<bool> GetMassInStatsCloud(string 用户名, string 密码, string 下载路径, int intSeason, string[] 表名Arr)
        {
            while (driver == null || statsCloudMainWindowHandle == null)
            {
                LoginInStatsCloud(用户名, 密码, 下载路径);
            }

            try
            {






                foreach (var tableName in 表名Arr)
                {

                    try
                    {
                        driver.SwitchTo().Window(statsCloudMainWindowHandle);
                        //driver.Navigate().Refresh();
                        //Thread.Sleep(1000);

                        // 创建 JavaScript 执行器
                        IJavaScriptExecutor js切换左侧 = (IJavaScriptExecutor)driver;

                        // 等待直到父元素可见,但是对于左侧栏只有一个"专用 直报"的用户,市不会有这个control控件的
                        //因此换一个等待的元素
                        WebDriverWait 切换左侧栏wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        // IWebElement parentElement = 切换左侧栏wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div._sc-admin-menu-control")));
                        IWebElement 左侧框元素 = 切换左侧栏wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='dsf-sc-admin-menu' and @position='left']")));
                        List<IWebElement> 小的上下切换的元素集合 = 左侧框元素.FindElements(By.XPath("//div[contains(@class, '_sc-admin-menu-control-item')]")).ToList();//就一个
                        if (小的上下切换的元素集合.Count > 1)
                        {
                            小的上下切换的元素集合[小的上下切换的元素集合.Count - 1].Click();
                        }
                        Thread.Sleep(1000);
                        IWebElement 专用直报元素 = null;
                        var allElements = driver.FindElements(By.CssSelector(".el-tooltip._sc-admin-menu-item"));

                        foreach (var element in allElements)
                        {
                            // 获取所有子元素 ._sc-admin-menu_label_text
                            var textElements = element.FindElements(By.CssSelector("._sc-admin-menu_label_text"))
                                                      .Select(e => e.Text.Trim())
                                                      .ToList();

                            // 检查这些文本是否包含 "专", "用", "直", "报"
                            if (textElements.Contains("专") && textElements.Contains("用") &&
                                textElements.Contains("直") && textElements.Contains("报"))
                            {
                                专用直报元素 = element;
                                ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 专用直报元素);//有反应

                                // 这里可以根据需要对匹配的元素进行进一步处理
                                break; // 如果只需要第一个匹配项，可以在此处退出循环
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        StaticLogger.SystemError($"从主界面打开专用直报出现错误,错误信息{ex.Message},{Environment.NewLine}堆栈为{ex.StackTrace},{Environment.NewLine}对象为{ex.Source},{Environment.NewLine}方法为{ex.TargetSite}");
                    
                    }

                    try
                    {
                        var windowHandles = driver.WindowHandles;
                        string 专用直报窗口 = null;
                        // 遍历窗口句柄，切换到新窗口
                        //foreach (var handle in windowHandles)
                        //{
                        //    if (handle != statsCloudMainWindowHandle)
                        //    {
                        //        专用直报窗口 = handle;
                        //        driver.SwitchTo().Window(handle);
                        //        break;
                        //    }
                        //}
                        driver.SwitchTo().Window(windowHandles[windowHandles.Count - 1]);


                        //WebDriverWait 高级按钮_wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        //IWebElement 高级按钮 = 高级按钮_wait.Until(ExpectedConditions.ElementIsVisible(By.Id("details-button")));
                        //高级按钮_wait.Until<bool>((d) =>
                        //{
                        //    // 使用JavaScript代码判断页面的加载状态
                        //    return (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
                        //});
                        //// 定位到按钮元素
                        //IWebElement 高级btn = driver.FindElement(By.Id("details-button"));
                        //高级按钮.Click();
                        ////高级btn.Click();//两个都可以找到按钮



                        Thread.Sleep(3000);
                        //等待新网页加载好
                        WebDriverWait 专用直报网页_wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        专用直报网页_wait.Until(d =>
                        {
                            IJavaScriptExecutor js = (IJavaScriptExecutor)d;
                            return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                        });
                        Thread.Sleep(1000);

                    }
                    catch (Exception ex)
                    {
                        StaticLogger.SystemError($"driver尝试切换到专用直报出现错误,错误信息{ex.Message},{Environment.NewLine}堆栈为{ex.StackTrace},{Environment.NewLine}对象为{ex.Source},{Environment.NewLine}方法为{ex.TargetSite}");

                    }
                    //先找最大的元素

                    //IWebElement data_v_76303b2a = driver.FindElement(By.XPath("//div[@class='thtf-pro-layout thtf-pro-layout--mix hideSidebar withoutAnimation condensed']"));
                    //Debug.Print(data_v_76303b2a.Displayed.ToString());

                    //IWebElement element = driver.FindElement(By.XPath("//div[@data-v-76303b2a and contains(@class, 'router-tab')]"));
                    IWebElement formElement = driver.FindElement(By.XPath("//form[contains(@class, 'home-page-query-form')]"));//定位到form
                 


                    //#region 是不是重复了
                    //IWebElement Element = driver.FindElement(By.CssSelector("div[data-v-2d429846].justify-between"));
                    //Element = driver.FindElement(By.CssSelector("form[data-v-2d429846].el-form.home-page-query-form.el-form--inline"));//包裹整条的最后一个元素,
                    //#endregion



                    // Element.Click();
                    //试试用js直接执行
                    //IWebElement firstmini = driver.FindElement(By.CssSelector("div.el-form-item.el-form-item--mini"));
                    //((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", firstmini);//没反应


                    ////IReadOnlyCollection<IWebElement> divElements = Element.FindElements(By.CssSelector("div.el-form-item.el-form-item--mini"));
                    //List<IWebElement> list_element = Element.FindElements(By.CssSelector("div.el-form-item.el-form-item--mini")).ToList();
                    ////List<IWebElement> divList = new List<IWebElement>(divElements);
                    ////divList[0].Click();
                    //foreach (IWebElement item in list_element)
                    //{
                    //    Debug.Print(item.Displayed.ToString());
                    //    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", item);//没反应
                    //    if (item.Displayed == true)
                    //    {
                    //        item.Click();
                    //    }
                    //}

                    //IWebElement firstDivElement = Element.FindElement(By.CssSelector("div.el-form-item.el-form-item--mini"));
                    //Debug.Print(firstDivElement.Displayed.ToString());//这里怎么会是false
                    //IJavaScriptExecutor jsAddisfocus = (IJavaScriptExecutor)driver;
                    //jsAddisfocus.ExecuteScript("arguments[0].classList.add('is-focus');", firstDivElement);//没反应
                    //Debug.Print(firstDivElement.Displayed.ToString());
                    ////IJavaScriptExecutor jsExecutor = (IJavaScriptExecutor)driver;
                    ////jsExecutor.ExecuteScript("arguments[0].style.display = 'block';", firstDivElement);
                    //Debug.Print(firstDivElement.Displayed.ToString());
                    //Debug.Print(Element.Displayed.ToString());
                    //Debug.Print(Element.Enabled.ToString());

                    #region 根据定位到的form获取下面的4个
                    List<IWebElement> list_element = formElement.FindElements(By.CssSelector("div.el-input.el-input--mini")).ToList();//应该有四个,第一个是制度选择,第二个是调查频度,第三个是报告期,第四个是表号
                    #endregion















                    // 定位元素
                    IWebElement 制度选择框 = driver.FindElement(By.CssSelector("input[placeholder='请选择制度']"));
                    ////跟下面方法一样
                    //IWebElement 制度选择框 = 专业直报网页_wait.Until(ExpectedConditions.ElementIsVisible(
                    //        By.XPath("//input[@placeholder='请选择制度']")
                    //    ));


                    //以下三个方式点击都有反应,属于是重复了
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 制度选择框);//有反应
                                                                                                //制度选择框.SendKeys("A农林牧渔业统计报表制度（2024）");
                                                                                                // 定位到 input 元素的父级 div
                    
                    IWebElement 制度选择框上级Div = 制度选择框.FindElement(By.XPath(".."));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 制度选择框上级Div);//有反应
                    Debug.Print(制度选择框.Displayed.ToString());
                    // 使用 JavaScript 修改制度选择框上级Div元素的 class 属性
                    //IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
                    //js.ExecuteScript("arguments[0].classList.add('is-focus');", 制度选择框上级Div);
                    //找到span元素
                    IWebElement 制度选择spanElement = 制度选择框上级Div.FindElement(By.XPath("./span[@class='el-input__suffix']"));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 制度选择spanElement);//有反应
                    Thread.Sleep(1000);
                    /*
                     * 元素不可交互,只能用javascript执行
                     */
                    //制度选择框上级Div.Click();
                    //制度选择spanElement.Click();
                    //制度选择框.Click();

                    /*
                     * 找到下拉框的显示内容
                     *   //不通过min-width=xxpx来找了,通过

                     * 
                     */
                    //定位到制度选择框的选项内容
                    //List<IWebElement> body后面的下拉框 = null;
                    //body后面的下拉框 = driver.FindElements(By.CssSelector("div.el-select-dropdown__wrap.el-scrollbar__wrap")).ToList();

                    //// IWebElement body最后的制度选择框项目 = driver.FindElement(By.CssSelector("div.el-select-dropdown[style*='min-width: 320px']"));
                    //IWebElement body最后的制度选择框项目 = body后面的下拉框[1];
                    //IWebElement 选项所在的ul = body最后的制度选择框项目.FindElement(By.CssSelector("ul.el-scrollbar__view.el-select-dropdown__list"));
                    IWebElement 要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), 'A农林牧渔业统计报表制度（2024）')]"));
                    //用js点击这个选项
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 要找的选项);
                    Thread.Sleep(1000);


                    #region 调查频度选择好
                    //这里是不是要切换回主上下文
                    // driver.SwitchTo().DefaultContent();
                    IWebElement 调查频度选择框 = list_element[1];
                    //用js执行
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 调查频度选择框);//有反应
                                                                                                  //IWebElement body最后的调查频度选择框选项 = driver.FindElement(By.CssSelector("div.el-select-dropdown[style*='min-width: 150px']"));
                                                                                                  //body后面的下拉框 = driver.FindElements(By.CssSelector("div.el-select-dropdown.el-popper")).ToList();
                                                                                                  //IWebElement body最后的调查频度选择框选项 = body后面的下拉框[1];
                                                                                                  //IWebElement 调查频度选项所在的ul = body最后的调查频度选择框选项.FindElement(By.CssSelector("ul.el-scrollbar__view.el-select-dropdown__list"));
                    Thread.Sleep(1000);
                    IWebElement 调查频度要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), '季报')]"));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 调查频度要找的选项);
                    //用js点击这个选项
                    //定位到
                    Thread.Sleep(1000);

                    //报告期还没写
                    IWebElement 报告期选择框 = list_element[2];
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 报告期选择框);
                    Thread.Sleep(1000);
                    //body后面的下拉框 = driver.FindElements(By.CssSelector("div.el-select-dropdown.el-popper")).ToList();
                    //IWebElement body最后的位置的报告期选择框选项 = body后面的下拉框[2];
                    //  IWebElement body最后的位置的报告期选择框选项 = driver.FindElement(By.CssSelector("div.el-select-dropdown[style*='min-width: 180px']"));
                    //IWebElement 报告期选项所在的ul = body最后的位置的报告期选择框选项.FindElement(By.CssSelector("ul.el-scrollbar__view.el-select-dropdown__list"));
                    IWebElement 报告期要找的选项 = null;
                    if (intSeason == 1)
                    {
                        报告期要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), '第1')]"));
                    }
                    else if (intSeason == 2)
                    {
                        报告期要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), '第2')]"));
                    }
                    else if (intSeason == 3)
                    {
                        报告期要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), '第3')]"));
                    }
                    else
                    {
                        报告期要找的选项 = driver.FindElement(By.XPath(".//span[contains(text(), '第4')]"));
                    }
                  ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 报告期要找的选项);
                    Thread.Sleep(1000);
                    //表名
                    IWebElement 表名表号输入框div = list_element[3];
                    IWebElement 表名表号输入的ipnut = 表名表号输入框div.FindElement(By.ClassName("el-input__inner"));
                    表名表号输入的ipnut.SendKeys(tableName);
                    Thread.Sleep(1000);
                    IWebElement 查询按钮 = driver.FindElement(By.XPath("//span[text()='查询']/ancestor::button"));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 查询按钮);
                    //等待新网页加载好
                    WebDriverWait 点击查询后_wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    点击查询后_wait.Until(d =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)d;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(2000);
                    #endregion
                    //在C#中使用Selenium来定位具有特定类名（如 swiper-slide swiper-slide-card）的 div 元素，你可以使用 FindElement 方法配合 By.CssSelector 或 By.ClassName。不过，由于 swiper-slide 和 swiper-slide-card 是两个类名，By.ClassName 只能接受一个类名，所以使用 By.CssSelector 会更灵活。
                    var sliderElement = driver.FindElements(By.CssSelector("div.swiper-slide.swiper-slide-card")).ToList();
                    IWebElement A412slide = driver.FindElements(By.CssSelector("div.swiper-slide.swiper-slide-card")).ToArray()[0];


                    List<IWebElement> List_数据查询 = A412slide.FindElements(By.XPath(".//button[.//span[text()='数据查询']]")).ToList();
                    IWebElement 数据查询btn = List_数据查询[0];//不用list 懒得改了
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 数据查询btn);






















                    ///第三个页面了,即数据查询界面
                    //先等待界面加载好
                    WebDriverWait 基层数据查询_wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    基层数据查询_wait.Until(d =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)d;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(2000);
                    IWebElement cbx选择查询模板 = driver.FindElement(By.XPath("//div[.//input[@placeholder='请选择查询模板']]"));
                    //找到input的上一级div 
                    //IWebElement div选择查询模板  = cbx选择查询模板.FindElement(By.XPath(".."));
                    //IWebElement dbx选择查询模板的上上一级div = div选择查询模板.FindElement(By.XPath(".."));


                    //用js执行

                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", cbx选择查询模板);//执行到这里了
                    WebDriverWait 点击完查询模板cbx = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    点击完查询模板cbx.Until(thisdriver =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)thisdriver;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(2000);                                                                               //IWebElement 模板下拉框的全部  =  driver.FindElement(By.XPath("//div[@class='el-popper el-cascader__dropdown' and @style='position: absolute; top: 159px; left: 197px; transform-origin: center top; z-index: 2009;']"));

                    //找一下"全部"所在的label试试
                    IWebElement 全部labelElement = driver.FindElement(By.XPath("//span[span[text()='全部']]"));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 全部labelElement);
                    //全部labelElement.Click();
                    //IWebElement 全部的spanElement = 模板下拉框的全部.FindElement(By.XPath(".//li[@role='menuitem']//span[normalize-space(text())='全部']"));
                    //((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 全部的spanElement);//有反应
                    WebDriverWait 点击完查询模板中的全部 = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    点击完查询模板中的全部.Until(thisdriver =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)thisdriver;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(500);

                    //找到模板1
                    IWebElement[] 所有导出模板所在的span = driver.FindElements(By.XPath("//span[contains(text(), '导出模板')]")).ToArray();
                    IWebElement 可见的导出模板所在的sapn;

                    可见的导出模板所在的sapn = 所有导出模板所在的span[所有导出模板所在的span.Length - 1];

                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 可见的导出模板所在的sapn);
                    //模板1所在的span.Click();
                    WebDriverWait 点击完含导出模板 = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    点击完含导出模板.Until(thisdriver =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)thisdriver;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });

                    Thread.Sleep(2000);
                    //找到右下角的xx条/页
                    IWebElement[] 条数选择框 = driver.FindElements(By.XPath("//span[@class='el-input__suffix-inner' and .//i[@class='el-select__caret el-input__icon el-icon-arrow-up']]")).ToArray();
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 条数选择框[条数选择框.Length - 1]);
                    IWebElement 每页1000条 = driver.FindElement(By.XPath("//li[@class='el-select-dropdown__item' and span[text()='1000条/页']]"));
                    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 每页1000条);
                    //等待新网页加载好
                    WebDriverWait 点击每页1000条后_wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                    点击每页1000条后_wait.Until(d =>
                    {
                        IJavaScriptExecutor js = (IJavaScriptExecutor)d;
                        return (bool)js.ExecuteScript("return document.readyState === 'complete'");
                    });
                    Thread.Sleep(2000);

                    //找到结果全选按钮
                    try
                    {
                        ////先找找看有没有"取消全选"的按钮,有的话,就可以直接点"剪切板"了
                        //IWebElement[] 取消全选 = driver.FindElements(By.XPath("//span[contains(text(), '结果全选')]")).ToArray();
                        //if (取消全选.Length == 0)
                        //{
                        //    // IWebElement[] 结果全选span = driver.FindElements(By.CssSelector("span:contains('结果全选')")).ToArray();此写法不行
                        //    IWebElement[] 结果全选span = driver.FindElements(By.XPath("//span[contains(text(), '结果全选')]")).ToArray();
                        //    IWebElement 结果全选btn = 结果全选span[0].FindElement(By.XPath("ancestor::button"));//根据span找到上一级的button
                        //    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 结果全选btn);
                        //}


                        //先通过class找到结果全选这个button
                        IWebElement[] 结果全选btn = driver.FindElements(By.CssSelector(".el-button.el-tooltip.tool-tip-common-btn.common-select-all-button.el-button--default.el-button--mini")).ToArray();

                        IWebElement span = 结果全选btn[0].FindElement(By.TagName("span"));
                        string spanText = span.Text;
                        if (spanText.Equals("结果全选"))
                        {
                            ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 结果全选btn[0]);
                        }
                        Thread.Sleep(1000);
                    }
                    catch (Exception ex)
                    {
                        StaticLogger.SystemError($"点击结果全选时出错,错误信息为{ex.Message}");
                        Debug.Print(ex.Message);
                    }

                    //这里注销了反而能正常执行
                    /*if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
                    //?. 运算符会首先检查 Application.Current 是否为 null。如果不为 null，就会继续访问 .ApplicationLifetime 属性；如果为 null，则整个表达式的结果为 null，而不抛出 NullReferenceException 异常。
                    {
                        var clipboard = desktop.MainWindow?.Clipboard;
                        if (clipboard != null)
                        {
                            await clipboard.ClearAsync();
                        }

                    }*/
                    driver.SwitchTo().DefaultContent();
                    //找到"剪切板"按钮
                    IWebElement 剪切板btn的span = driver.FindElement(By.XPath("//span[contains(text(), '剪贴板')]"));
                    IWebElement 剪切板btn = 剪切板btn的span.FindElement(By.XPath("ancestor::button"));
                    // ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 剪切板btn);
                    剪切板btn.Click();//在这里也可以


                    //IWebElement 剪切板btn的span = driver.FindElement(By.XPath("//use[@xlink:href='#icon-copy']"));

                    //IWebElement 剪切板btn = 剪切板btn的span.FindElement(By.XPath("ancestor::button"));
                    //((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", 剪切板btn);

                    MyProgressBar _progressBar = new MyProgressBar();
                    _progressBar.Show();
                    var progress = new Progress<int>(value => _progressBar.UpdateProgress(value));
                    FuncOutCome funcOutCome = await Task.Run(() => PasteToSqlite.ImportPasteToSqlite(progress));
                    _progressBar.Close();
                    //await  Task.Run(()=> _progressBar.Close());

                    driver.Close();
                    driver.SwitchTo().Window(statsCloudMainWindowHandle);
                }

                //读取内存内容();

                return true;
            }
            catch (Exception ex)
            {
                StaticLogger.SystemError("下载统计云数据出错", ex);
                return false;
            }
        }

        public static async void 读取内存内容()
        {
            //string clipboardText = System.Windows.Forms. Clipboard.GetText();
            //Debug.Print(clipboardText);
            // 获取剪贴板中的文本
            if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
            //?. 运算符会首先检查 Application.Current 是否为 null。如果不为 null，就会继续访问 .ApplicationLifetime 属性；如果为 null，则整个表达式的结果为 null，而不抛出 NullReferenceException 异常。
            {
                var clipboard = desktop.MainWindow?.Clipboard;
                string clipboardText = await clipboard?.GetTextAsync();
                if (string.IsNullOrEmpty(clipboardText) == false)
                {

                    Console.WriteLine("剪贴板中的文本内容:");
                    Console.WriteLine(clipboardText);

                    // 解析文本数据
                    var rows = clipboardText.Split('\n'); // 按行分割
                    foreach (var row in rows)
                    {
                        var columns = row.Split('\t'); // 按制表符分割
                        foreach (var column in columns)
                        {
                            Console.Write($"{column}\t");
                        }
                        Console.WriteLine();
                    }
                }
                else
                {
                    Console.WriteLine("剪贴板不包含文本内容");
                }
            }
        }
        #endregion






        static bool IsFirefoxRunning()
        {
            // 使用 ps 命令检查 Firefox 进程是否存在
            var processStartInfo = new ProcessStartInfo
            {
                FileName = "/bin/bash",
                Arguments = "-c \"ps -e | grep firefox\"",
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true,
            };

            using (var process = new Process { StartInfo = processStartInfo })
            {
                process.Start();
                string output = process.StandardOutput.ReadToEnd();
                process.WaitForExit();

                // 如果有输出，说明 Firefox 进程存在
                return !string.IsNullOrEmpty(output);
            }
        }

        static void ConnectToRunningFirefox()//没用了
        {
            try
            {
                // 配置 FirefoxOptions
                var options1 = new FirefoxOptions();
                // options1.DebuggerAddress = "localhost:4444"; // 使用 Marionette 端口

                // 创建 RemoteWebDriver 实例
                var driver = new RemoteWebDriver(new Uri("http://localhost:4444"), options1.ToCapabilities());

                // 导航到一个网页
                driver.Navigate().GoToUrl("http://www.baidu.com");

                // 打印页面标题
                Console.WriteLine("Page title: " + driver.Title);

                // 关闭浏览器
                driver.Quit();
            }
            catch (Exception ex)
            {
                MyMessagebox.Show("Failed to connect to running Firefox: " + ex.Message);
            }
        }
    }


}
